package com.project.class4_8.proxy1.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ServiceProxy implements InvocationHandler {
   private Object targetObj;
   public ServiceProxy(Object targetObj){
       this.targetObj = targetObj;
   }

    /**
     * 产生代理对象
     * @return 返回一个代理对象
     */
   public Object getProxy(){
       return Proxy.newProxyInstance(
               targetObj.getClass().getClassLoader(),
               targetObj.getClass().getInterfaces(),
               this
       );
   }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

       //得到目标对象的属性列表
        Field[] fieldArray = targetObj.getClass().getDeclaredFields();
        for (Field f : fieldArray){
            if (f.isAnnotationPresent(Auto.class)){
                //利用DAO工厂类，根据接口Class对象，找到实现类对象
                Object obj = DaoFactory.getDao(f.getType());
                //去掉访问修饰符的检查
                f.setAccessible(true);
                //将目标对象的属性赋值
                f.set(targetObj,obj);
            }
        }

       //执行目标对象的目标方法
       method.invoke(targetObj,args);
       return null;
    }
}
